package com.sbd.indicator;

import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator;
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.stereotype.Component;

import java.net.InetAddress;

// 当配置项management.health.www.enabled为true时才展示指标项
@ConditionalOnEnabledHealthIndicator("www")

/**
 * 指标项名称，是根据Bean名称来决定的，比如Bean名称为xxxHealthIndicator，那么指标项名称就为xxx。
 * 本例如果使用默认的类名为Bean名称，则指标项名称为internet
 * 这里重新定义Bean名称为wwwHealthIndicator，则指标项为名称为www
 */
@Component(value="wwwHealthIndicator")
public class InternetHealthIndicator extends AbstractHealthIndicator {

    // 通过监测腾讯服务器，看能否访问互联网
    private final static String QQ_HOST = "www.qq.com";
    // 超时时间为5s
    private final static int TIMEOUT = 5000;

    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        // 监测腾讯服务器
        boolean status = ping();
        if (status) {
            // 健康指标为可用状态，并添加一个消息项
            builder.withDetail("message", "当前服务器可以访问万维网。").up();
        } else {
            // 健康指标为不再提供服务，并添加一个消息项
            builder.withDetail("message", "当前无法访问万维网").outOfService();
        }
    }

    // 监测腾讯服务器能够访问，用以判断能否访问万维网
    private boolean ping() throws Exception {
        try {
            // 当返回值是true时，说明host是可用的，是false则不可用
            return InetAddress.getByName(QQ_HOST).isReachable(TIMEOUT);
        } catch (Exception ex) {
            return false;
        }
    }
}
